function max(a,b){
    if(a>b)
        return a;
    return b;
}
function min(a,b){
    if(a<b)
        return a;
    return b;
}

function between(low, val, high){
    return max(low, min(val,high));
}

function abs(a){
    if(a>0.0)
        return a;
    return -a;
}

var Rfc2988 = function() {
    this.G = 1.0;
    this.RTO = 3.0;
    this.SRTT = null;
    this.update = function(newR){
        if(this.SRTT == null){
            this.SRTT=newR;
            this.RTTVAR=newR/2.0;
            this.RTO=this.SRTT + max(this.G, 4.0*this.RTTVAR);
        }else{
            var alpha=1.0/8.0;
            var beta=1.0/4.0;
            this.RTTVAR=(1.0 - beta) * this.RTTVAR + beta * abs(this.SRTT - newR);
            this.SRTT=(1.0 - alpha) * this.SRTT + alpha * newR;
            this.RTO=this.SRTT + max(this.G, 4.0*this.RTTVAR);
        }
        return this.RTO;
    };
    this.get = function(){
        return this.RTO;
    };
};



/*
from:
http://techpatterns.com/downloads/javascript_cookies.php
*/

function Set_Cookie( name, value, expires, path, domain, secure )
{
    // set time, it's in milliseconds
    var today = new Date();
    today.setTime( today.getTime() );

    /*
    if the expires variable is set, make the correct
    expires time, the current script below will set
    it for x number of days, to make it for hours,
    delete * 24, for minutes, delete * 60 * 24
    */
    if ( expires ){
        expires = expires * 1000 * 60 * 60 * 24;
    }
    var expires_date = new Date( today.getTime() + (expires) );

    document.cookie = name + "=" +escape( value ) +
        ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
        ( ( path ) ? ";path=" + path : "" ) +
        ( ( domain ) ? ";domain=" + domain : "" ) +
        ( ( secure ) ? ";secure" : "" );
}

// this fixes an issue with the old method, ambiguous values
// with this test document.cookie.indexOf( name + "=" );
function Get_Cookie( check_name ) {
    // first we'll split this cookie up into name/value pairs
    // note: document.cookie only returns name=value, not the other components
    var a_all_cookies = document.cookie.split( ';' );
    var a_temp_cookie = '';
    var cookie_name = '';
    var cookie_value = '';
    var b_cookie_found = false; // set boolean t/f default f

    for ( i = 0; i < a_all_cookies.length; i++ ){
        // now we'll split apart each name=value pair
        a_temp_cookie = a_all_cookies[i].split( '=' );


        // and trim left/right whitespace while we're at it
        cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');

        // if the extracted name matches passed check_name
        if ( cookie_name == check_name ){
            b_cookie_found = true;
            // we need to handle case where cookie has no value but exists (no = sign, that is):
            if ( a_temp_cookie.length > 1 )
            {
                    cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') );
            }
            // note that in cases where cookie is initialized but no value, null is returned
            return cookie_value;
            break;
        }
        a_temp_cookie = null;
        cookie_name = '';
    }
    if ( !b_cookie_found ){
            return null;
    }
}
	
// this deletes the cookie when called
function Delete_Cookie( name, path, domain ) {
    if ( Get_Cookie( name ) ) document.cookie = name + "=" +
    ( ( path ) ? ";path=" + path : "") +
    ( ( domain ) ? ";domain=" + domain : "" ) +
    ";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}





// http://xkr.us/articles/dom/iframe-document/
function iframe_document(oIframe) {
    var oDoc = oIframe.contentWindow || oIframe.contentDocument;
    if (oDoc.document) {
        oDoc = oDoc.document;
    }
    return oDoc;
}

function set_iframe_document(outputbox, output){
    var o = iframe_document(outputbox);

    var r = false;
    if(outputbox.contentWindow && outputbox.contentWindow.pageYOffset)
        r = outputbox.contentWindow.pageYOffset;

    var s = o.body.scrollTop;
    o.body.innerHTML = output;
    o.body.scrollTop = s;

    if(r)
        outputbox.contentWindow.scrollBy(0, r - outputbox.contentWindow.pageYOffset);
}

